package thread;

public class ThreadSafety {
    /*
    1、什么是线程安全？

        如果你的代码所在的线程中有多个线程在同时运行，而这些线程可能会同时运行这段代码；
    如果每次运行结果和单线程运行的结果是一样的，而且其他的变量的值也和预期的是一样的，
    就是线程安全的，或者说：一个类或者程序所提供的接口对于线程来说是原子操作或者多个
    线程之间的切换不会导致该接口的执行结果存在二义性，也就是说我们不用考虑同步的问题。
        线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有
    读操作，而无写操作，一半来说，这个全局变量是线程安全的；若有多个线程同时执行写操作
    ，一般都需要考虑线程同步，否则的话就可能影响线程安全。

    2、为什么要使用多线程编程？

        多线程就像是人体一样，一直在并行的做许多工作，例如，人可以同时呼吸，血液循环，消化食物的。
    多线程可以将一个程序划分成多个任务，他们彼此独立的工作，以方便有效的使用处理器和用户的时间。

    3、启动一个线程是用run()还是start()？

        启动一个线程是调用start()方法，使线程所带边的虚拟处理机处于可运行状态，这意味着她可以由
    JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。

    4、sleep()和wait()有什么区别？

        sleep方法是线程类（Tread）的方法，导致此线程暂停执行指定时间，把执行机会给其他线程，但是
    监控状态依然保持，到时后会自动恢复。调用sleep不会释放对象锁。wait是Object类的方法，对象
    调用wait方法导致本线程放弃对象锁，进入等待此对象的等待锁定池，只有针对此对象发出notify方法
    （或notifyAll）后本线程才进入对象锁定池准备获得对象进入运行状态。

    5、sleep和yield的区别？

        yield方法只是让出分配给自己的CPU时间片，并且会立刻进入Runnable状态参与CPU时间的竞争，若
    程序中没有其他线程，那么该线程马上就会开始往下执行；sleep会进入Blocked状态，等待时间结束
    事件的发生，然后进入Runnable状态参与CPU时间的竞争。

    6、当一个线程进入一个对象的一个synchronized方法后，其它线程是否可进入此对象的其他方法？

    其它线程只能访问该对象的其他非同步方法，同步方法则不能进入。

    7、请说出你所知道的线程同步的方法

        实现同步方法为使用synchronized关键字，实现方式：
        1、同步方法。可以是静态和非静态方法，不可以是抽象和接口方法。当一个线程调用这个对象
    同步方法，则这个对象的其他所有同步方法将被锁定，不能调用，但可以调用非同步方法。非静态方法
    所属的主题对象自身。静态同步方法锁定的是主体类对应的Class类型的对象，所以静态同步方法只跟
    所属类的其他静态同步方法相互制约。
        2、同步块。锁定一个制定的对象，来对同步块中的代码进行同步。

    8、同步和异步有何异同，在什么情况下分别使用他们？距离说明

        如果数据将在线程间共享，使用同步编程。例如正在写的数据以后可能被另一个线程读到，或者正在读的
    数据可能已经被另一个线程写过了，那么这些数据就是共享数据，必须进行同步存取。当应用程序在对象上
    调用了一个需要花费很长时间来执行的方法，并且不希望让程序等待方法的返回时，则使用异步编程，在很
    多情况下采用异步途径往往更有效率，比如发送短信。

    9、简述synchronized和java.util.concurrent.locks.lock的异同？

    相同点：Lock和synchronized都可以实现了线程同步；
    不同点：Lck有比synchronized更确的线程语义和更好的性能。synchronized会自动释放锁，而Lock一定
    要求程序员手工释放，并且必须在finally从句中释放。

     */
}
